#include "wx/wxprec.h"
#if wxUSE_MSGDLG && (!defined(__WXGTK20__) || defined(__WXUNIVERSAL__) || defined(__WXGPE__))

#include <stdio.h>
#include <string.h>

#define __WX_COMPILING_MSGDLGG_CPP__ 1
#include "wx/msgdlg.h"
#include "wx/artprov.h"

#if wxUSE_STATLINE
#include "wx/statline.h"
#endif

// ----------------------------------------------------------------------------
// icons
// ----------------------------------------------------------------------------

BEGIN_EVENT_TABLE( wxGenericMessageDialog, wxDialog )
  EVT_BUTTON( wxID_YES, wxGenericMessageDialog::OnYes )
  EVT_BUTTON( wxID_NO, wxGenericMessageDialog::OnNo )
  EVT_BUTTON( wxID_CANCEL, wxGenericMessageDialog::OnCancel )
END_EVENT_TABLE()

IMPLEMENT_CLASS( wxGenericMessageDialog, wxDialog )

wxGenericMessageDialog::wxGenericMessageDialog( wxWindow *parent,
    const wxString& message,
    const wxString& caption,
    long style,
    const wxPoint& pos )
  : wxDialog( parent, wxID_ANY, caption, pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE ) {
  SetMessageDialogStyle( style );
  bool is_pda = ( wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA );
  wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
  wxBoxSizer *icon_text = new wxBoxSizer( wxHORIZONTAL );
  #if wxUSE_STATBMP
  // 1) icon
  if( style & wxICON_MASK ) {
    wxBitmap bitmap;
    switch( style & wxICON_MASK ) {
      default:
        wxFAIL_MSG( _T( "incorrect log style" ) );
      // fall through
      case wxICON_ERROR:
        bitmap = wxArtProvider::GetIcon( wxART_ERROR, wxART_MESSAGE_BOX );
        break;
      case wxICON_INFORMATION:
        bitmap = wxArtProvider::GetIcon( wxART_INFORMATION, wxART_MESSAGE_BOX );
        break;
      case wxICON_WARNING:
        bitmap = wxArtProvider::GetIcon( wxART_WARNING, wxART_MESSAGE_BOX );
        break;
      case wxICON_QUESTION:
        bitmap = wxArtProvider::GetIcon( wxART_QUESTION, wxART_MESSAGE_BOX );
        break;
    }
    wxStaticBitmap *icon = new wxStaticBitmap( this, wxID_ANY, bitmap );
    if( is_pda ) {
      topsizer->Add( icon, 0, wxTOP | wxLEFT | wxRIGHT | wxALIGN_LEFT, 10 );
    } else
    { icon_text->Add( icon, 0, wxCENTER ); }
  }
  #endif // wxUSE_STATBMP
  #if wxUSE_STATTEXT
  // 2) text
  icon_text->Add( CreateTextSizer( message ), 0, wxALIGN_CENTER | wxLEFT, 10 );
  topsizer->Add( icon_text, 1, wxCENTER | wxLEFT | wxRIGHT | wxTOP, 10 );
  #endif // wxUSE_STATTEXT
  // 3) buttons
  int center_flag = wxEXPAND;
  if( style & wxYES_NO ) {
    center_flag = wxALIGN_CENTRE;
  }
  wxSizer *sizerBtn = CreateSeparatedButtonSizer( style & ButtonSizerFlags );
  if( sizerBtn ) {
    topsizer->Add( sizerBtn, 0, center_flag | wxALL, 10 );
  }
  SetAutoLayout( true );
  SetSizer( topsizer );
  topsizer->SetSizeHints( this );
  topsizer->Fit( this );
  wxSize size( GetSize() );
  if( size.x < size.y * 3 / 2 ) {
    size.x = size.y * 3 / 2;
    SetSize( size );
  }
  Centre( wxBOTH | wxCENTER_FRAME );
}

void wxGenericMessageDialog::OnYes( wxCommandEvent& ( event ) ) {
  EndModal( wxID_YES );
}

void wxGenericMessageDialog::OnNo( wxCommandEvent& ( event ) ) {
  EndModal( wxID_NO );
}

void wxGenericMessageDialog::OnCancel( wxCommandEvent& ( event ) ) {
  // Allow cancellation via ESC/Close button except if
  // only YES and NO are specified.
  const long style = GetMessageDialogStyle();
  if( ( style & wxYES_NO ) != wxYES_NO || ( style & wxCANCEL ) ) {
    EndModal( wxID_CANCEL );
  }
}

#endif // wxUSE_MSGDLG && !defined(__WXGTK20__)
